import socket
import urllib.request
import urllib.error
import time

def validate_ip(ip):
    """
    验证IP地址格式是否正确
    """
    parts = ip.split('.')
    if len(parts) != 4:
        return False
    try:
        return all(0 <= int(part) <= 255 for part in parts)
    except ValueError:
        return False

def get_ip_list():
    """
    手动获取IP地址列表
    """
    ips = []
    print("\n请输入IP地址列表（每行一个IP，输入空行结束）:")
    
    while True:
        ip = input("IP地址: ").strip()
        if not ip:
            break
        
        if validate_ip(ip):
            ips.append(ip)
            print(f"✓ 已添加: {ip}")
        else:
            print(f"✗ 无效的IP地址格式: {ip}")
    
    return ips

def test_ip(ip, timeout=5):
    """
    测试IP是否可用于访问百度官网
    返回True表示IP可用，False表示不可用
    """
    print(f"\n测试 IP: {ip}")
    
    # 1. 首先测试IP连接性
    print(f"  检查连接...")
    try:
        socket.setdefaulttimeout(timeout)
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect((ip, 80))
        print(f"  ✓ IP连接成功")
    except Exception as e:
        print(f"  ✗ IP连接失败: {str(e)}")
        return False
    
    # 2. 测试使用该IP代理访问百度
    print(f"  测试访问百度...")
    try:
        # 设置代理
        proxy_handler = urllib.request.ProxyHandler({
            'http': f'http://{ip}:80',
            'https': f'https://{ip}:443'
        })
        
        # 创建opener
        opener = urllib.request.build_opener(proxy_handler)
        opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)')]
        
        # 设置超时并发送请求
        start_time = time.time()
        response = opener.open('http://www.baidu.com', timeout=timeout)
        elapsed = time.time() - start_time
        
        status_code = response.getcode()
        print(f"  ✓ 访问成功，状态码: {status_code}")
        print(f"  ✓ 响应时间: {elapsed:.2f}秒")
        
        return status_code == 200
    
    except urllib.error.URLError as e:
        print(f"  ✗ 访问失败: {str(e)}")
        return False
    except Exception as e:
        print(f"  ✗ 发生错误: {str(e)}")
        return False

def export_available_ips(ips, output_file):
    """
    将可用的IP导出到CSV文件
    """
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write('可用IP地址\n')
            for ip in ips:
                f.write(f'{ip}\n')
        print(f"\n✓ 可用IP已成功导出到: {output_file}")
        print("  提示: CSV文件可以直接用Excel打开")
    except Exception as e:
        print(f"\n✗ 导出文件时出错: {str(e)}")

def main():
    # 打印欢迎信息
    print("=" * 60)
    print("       IP地址状态测试工具       ")
    print("=" * 60)
    print("功能: 测试IP地址是否可用于访问百度官网")
    print("说明: 本工具使用Python标准库，无需安装额外依赖")
    print("=" * 60)
    
    # 获取IP列表
    ips = get_ip_list()
    
    # 检查是否有IP地址
    if not ips:
        print("\n✗ 没有输入任何IP地址，程序退出")
        return
    
    # 显示统计信息
    print(f"\n✓ 共获取到 {len(ips)} 个IP地址")
    print("开始测试...")
    print("=" * 60)
    
    # 测试所有IP
    available_ips = []
    start_time = time.time()
    
    for i, ip in enumerate(ips, 1):
        print(f"\n[{i}/{len(ips)}]")
        if test_ip(ip):
            available_ips.append(ip)
            print(f"  ✅ IP {ip} 可用!")
        else:
            print(f"  ❌ IP {ip} 不可用")
        
        # 避免请求过快，添加短暂延迟
        if i < len(ips):
            time.sleep(1)
    
    # 显示测试结果
    total_time = time.time() - start_time
    print("\n" + "=" * 60)
    print("测试完成!")
    print(f"总耗时: {total_time:.2f}秒")
    print(f"测试IP总数: {len(ips)}")
    print(f"可用IP数量: {len(available_ips)}")
    print(f"可用率: {len(available_ips) / len(ips) * 100:.1f}%")
    
    # 显示可用IP列表
    if available_ips:
        print("\n可用IP地址列表:")
        for i, ip in enumerate(available_ips, 1):
            print(f"  {i}. {ip}")
        
        # 导出可用IP
        output_file = r'c:\Users\Administrator\Desktop\ip_pool\available_ips.csv'
        export_available_ips(available_ips, output_file)
    else:
        print("\n✗ 没有找到可用的IP地址")
    
    print("\n" + "=" * 60)
    print("程序执行完毕")
    input("按回车键退出...")

if __name__ == "__main__":
    main()